/*
 * @version: 1.0
 * @Author: zhl
 * @Date: 2021-12-14 15:56:07
 * @LastEditors: zhl
 * @LastEditTime: 2021-12-15 16:02:31
 * @Description: 接口类
 */
#ifndef __MODULE_INTERFACE_MANAGER_H__
#define __MODULE_INTERFACE_MANAGER_H__

#include "config.h"
#include "dataBuffer.h"
#include "hashmap.h"

#define STR2(x) #x
#define STR(x) STR2(x)

#define FUNC_FLAG_NAME      flag
#define FUNC_INIT_NAME      init
#define FUNC_QUIT_NAME      quit
#define FUNC_RUN_NAME       run
#define FUNC_RESET_NAME     reset
#define FUNC_DESTROY_NAME   destroy
#define FUNC_PACKET_NAME    packet
#define FUNC_UNPACKET_NAME  unpacket
#define FUNC_PACKET_PARENT_NAME   packetParentFrame
#define FUNC_UNPACKET_PARENT_NAME unpacketParentFrame

#define FUNC_FLAG_NAME_STR      STR(FUNC_FLAG_NAME)
#define FUNC_INIT_NAME_STR      STR(FUNC_INIT_NAME)
#define FUNC_QUIT_NAME_STR      STR(FUNC_QUIT_NAME)
#define FUNC_RUN_NAME_STR       STR(FUNC_RUN_NAME)
#define FUNC_RESET_NAME_STR     STR(FUNC_RESET_NAME)
#define FUNC_DESTROY_NAME_STR   STR(FUNC_DESTROY_NAME)
#define FUNC_PACKET_NAME_STR    STR(FUNC_PACKET_NAME)
#define FUNC_UNPACKET_NAME_STR  STR(FUNC_UNPACKET_NAME)

//
typedef const char* (*T_FUNC_MODULE_NAME)();
typedef T_MODULE_CONFIG* (*T_FUNC_MODULE_INIT)();
typedef T_MODULE_CONFIG* (*T_FUNC_MODULE_RESET)(const char* cfgStr);
typedef int  (*T_FUNC_MODULE_PACKET)(T_DATA_BUFFER* inData, T_DATA_BUFFER* outData);
typedef int  (*T_FUNC_MODULE_UNPACKET)(T_DATA_BUFFER* inData, T_DATA_BUFFER* outData);
typedef void (*T_FUNC_MODULE_DESTROY)();
typedef void (*T_FUNC_MODULE_RUN)();
typedef void (*T_FUNC_MODULE_QUIT)();
//
typedef struct _IMODULE{
    T_FUNC_MODULE_NAME     FUNC_FLAG_NAME;     //获取模块名称，也是模块的唯一标识
    T_FUNC_MODULE_INIT     FUNC_INIT_NAME;     //初始化
    T_FUNC_MODULE_RESET    FUNC_RESET_NAME;    //重置
    T_FUNC_MODULE_QUIT     FUNC_QUIT_NAME;     //退出
    T_FUNC_MODULE_PACKET   FUNC_PACKET_NAME;   //打包
    T_FUNC_MODULE_UNPACKET FUNC_UNPACKET_NAME; //解包
    T_FUNC_MODULE_DESTROY  FUNC_DESTROY_NAME;  //销毁
    T_FUNC_MODULE_RUN      FUNC_RUN_NAME;      //运行
}T_IMODULE;
//模块方法类型定义


typedef struct _IMODULE_FILE_LIST{
    char* fileName;
    struct _IMODULE_FILE_LIST *next;
    struct _IMODULE_FILE_LIST *head;
}T_IMODULE_FILE_LIST;

extern T_HASHMAP *g_modules;


/* data */
extern void loadModules(const char *module_dir);
extern T_IMODULE *getModule(T_IMODULE* module);
extern void moduleDestroy();


#endif //__MODULE_INTERFACE_MANAGER_H__